<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML>
<HEAD>
<TITLE>80386 Programmer's Reference Manual -- Section 16.2</TITLE>
</HEAD>
<BODY STYLE="width:80ch">
<B>up:</B> <A HREF="c16.htm">
Chapter 16 -- Mixing 16-Bit and 32 Bit Code</A><BR>
<B>prev:</B> <A HREF="s16_01.htm">16.1  How the 80386 Implements 16-Bit and 32-Bit Features</A><BR>
<B>next:</B> <A HREF="s16_03.htm">16.3  Sharing Data Segments Among Mixed Code Segments</A>
<P>
<HR>
<P>
<H1>16.2  Mixing 32-Bit and 16-Bit Operations</H1>
The 80386 has two instruction prefixes that allow mixing of 32-bit and
16-bit operations within one segment:
<UL>
<LI> The operand-size prefix (66H)
<LI> The address-size prefix (67H)
</UL>
<P>
These prefixes reverse the default size selected by the D-bit. For example,
the processor can interpret the word-move instruction <A HREF="MOV.htm">MOV</A> mem, reg in any of
four ways:
<UL>
<LI> In a USE32 segment:
<OL>
<LI> Normally moves 32 bits from a 32-bit register to a 32-bit
effective address in memory.
<LI> If preceded by an operand-size prefix, moves 16 bits from a 16-bit
register to 32-bit effective address in memory.
<LI> If preceded by an address-size prefix, moves 32 bits from a 32-bit
register to a16-bit effective address in memory.
<LI> If preceded by both an address-size prefix and an operand-size
prefix, moves 16 bits from a 16-bit register to a 16-bit effective
address in memory.
</OL>
<LI> In a USE16 segment:
<OL>
<LI> Normally moves 16 bits from a 16-bit register to a 16-bit
effective address in memory.
<LI> If preceded by an operand-size prefix, moves 32 bits from a 32-bit
register to 16-bit effective address in memory.
<LI> If preceded by an address-size prefix, moves 16 bits from a 16-bit
register to a32-bit effective address in memory.
<LI> If preceded by both an address-size prefix and an operand-size
prefix, moves 32 bits from a 32-bit register to a 32-bit effective
address in memory.
</OL>
</UL>
These examples illustrate that any instruction can generate any combination
of operand size and address size regardless of whether the instruction is in
a USE16 or USE32 segment. The choice of the USE16 or USE32 attribute for a
code segment is based upon these criteria:
<OL>
<LI> The need to address instructions or data in segments that are larger
than 64 Kilobytes.
<LI> The predominant size of operands.
<LI> The addressing modes desired. (Refer to 
<A HREF="c17.htm">Chapter 17</A> for an explanation
of the additional addressing modes that are available when 32-bit
addressing is used.)
</OL>
Choosing a setting of the D-bit that is contrary to the predominant size of
operands requires the generation of an excessive number of operand-size
prefixes.
<P>
<HR>
<P>
<B>up:</B> <A HREF="c16.htm">
Chapter 16 -- Mixing 16-Bit and 32 Bit Code</A><BR>
<B>prev:</B> <A HREF="s16_01.htm">16.1  How the 80386 Implements 16-Bit and 32-Bit Features</A><BR>
<B>next:</B> <A HREF="s16_03.htm">16.3  Sharing Data Segments Among Mixed Code Segments</A>
</BODY>
